package core_sql.day05.serializable

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 有个对象在driver声明，在executor（task）中使用到，这个对象需要实现序列化接口，并且这个对象是在每个task中都有一份
  *
  * 如果对象换成单例模式（在driver端声明），在executor中使用到，这个还是需要实现序列化接口，但是在每个executor中生成一个对象，
  * 类似于广播变量。
  *
  * 写成单例模式，在executor中调用，这个会更节省资源，
  * 注意：这里面不能直接使用单例对象，可以使用单例对象中的具体的属性。
  */

object SeralizableTest {

  def main(args: Array[String]): Unit = {


    val conf = new SparkConf().setAppName("SerializableTest").setMaster("local[*]")

    val sc = new SparkContext(conf)

    //这个变量是在哪一端定义的？（Driver端）
    val myRules = new MyRules

    val rdd = sc.makeRDD(List(("Hadoop"), ("Spark"), ("Storm")))

    val result: RDD[(String, String)] = rdd.map(word => {
      //函数中的业务逻辑是在哪里执行的呢？（Executor中的Task执行的）
      val v = myRules.rulesMap.getOrElse(word, "no-found")
      (word, v)
    })
    val r= result.collect()

    println(r.toBuffer)

    sc.stop()


  }

}

class MyRules extends Serializable {


  val rulesMap = Map[String, String]("Hadoop" -> "nice", "Spark" -> "perfect", "Storm" -> "soso")



}